#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:zhengxin
@file: Pandas_Stock_Data_Analysis.py
@time: 2025/2/27  14:10
# @describe: Pandas 股票数据分析
"""

"""
在股票数据分析中，pandas 是一个非常强大的工具，可以帮助我们处理和分析股票市场的数据。

在本章节我们使用 yfinance（雅虎财经库）下载历史股票数据，并进行各种分析，包括数据清洗、可视化、技术指标计算等。

yfinance 是一个 Python 库，可以轻松地从雅虎财经（Yahoo Finance）获取股票、基金、加密货币等资产的历史和实时数据。

通过 pandas，我们可以将这些数据存储为 DataFrame 并进行后续的分析。
    
    数据清洗：处理缺失值、删除不必要的列等。
    数据可视化：绘制股票的时间序列图、移动平均线、RSI 等。
    技术指标计算：如移动平均线（SMA）、相对强弱指数（RSI）等。
    日收益率与累计收益率分析：帮助评估股票的短期和长期表现。
    波动率分析：衡量股票的价格波动性。

注意点：yfinance股票数据，需翻墙
"""
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


# 获取茅台（600519.SS）的股票数据，日期范围从 2020-01-01 到 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')

# 查看数据的前几行
print(stock_data.head())
# 检查数据类型
print(type(stock_data))
print()



"""
数据清洗与处理
    在分析股票数据时，我们通常需要做一些数据清洗和处理。
    常见的步骤包括填充缺失值、删除无关列、数据类型转换等。
    在一些版本的 yfinance 中，可以自动引入了 pandas，不需要再引入，所以在使用 yfinance 时，你可以直接利用 pandas 提供的数据结构和功能来处理和分析数据。

检查缺失值并填充:
"""

# 检查缺失值
print(stock_data.isnull().sum())
print()

# 使用前向填充替换缺失值
stock_data.ffill(inplace=True)

# 或者使用后向填充
# stock_data.bfill(inplace=True)

# 检查缺失值是否已经处理
print(stock_data.isnull().sum())



"""
    删除无关列：
"""
# 删除"Volume"和"Adj Close"列
stock_data_cleaned = stock_data.drop(columns=['Volume'])
print(stock_data_cleaned)
print()


# 绘制茅台收盘价曲线
# 代码创建一个新的图形（figure），并设置其大小为宽10英寸、高6英寸
plt.figure(figsize=(10, 6))
# 绘制一个线图
plt.plot(stock_data_cleaned["Close"], label="Close Price")
plt.title("Maotai Stock Price (2020", fontsize=14)
plt.xlabel("Date", fontsize=12)
plt.ylabel("Close Price (CNY)", fontsize=12)
# 显示图例
plt.legend()
# 在图形上添加网格线
plt.grid(True)
plt.show()


# 计算 50 日和 200 日的移动平均线
stock_data_cleaned["SMA_50"] = stock_data_cleaned["Close"].rolling(window=50).mean()
stock_data_cleaned["SMA_200"] = stock_data_cleaned["Close"].rolling(window=200).mean()

# 绘制收盘价和移动平均线
plt.figure(figsize=(12, 6))
plt.plot(stock_data_cleaned['Close'], label='Close Price')
plt.plot(stock_data_cleaned['SMA_50'], label='50-Day SMA')
plt.plot(stock_data_cleaned['SMA_200'], label='200-Day SMA')
plt.title('Maotai Stock Price with Moving Averages', fontsize=14)
plt.xlabel('Date', fontsize=12)
plt.ylabel('Price (CNY)', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()



"""
2、相对强弱指数（RSI）
    RSI 是用来评估股票是否被过度买入或卖出的技术指标，一般来说，RSI 大于 70 表示过度买入，小于 30 表示过度卖出。
"""
# 计算 RSI 指标
delta = stock_data_cleaned["Close"].diff(1)
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)

# 计算平均收益和损失
avg_gain = gain.rolling(window=14).mean()
avg_loss = loss.rolling(window=14).mean()

# 计算相对强弱指数 RSI
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1+rs))

# 添加 RSI 到数据中
stock_data_cleaned["RSI"] = rsi
plt.figure(figsize=(12, 6))
plt.plot(stock_data_cleaned['RSI'], label='RSI')
plt.axhline(y=70, color='r', linestyle='--', label='Overbought (70)')
plt.axhline(y=30, color='g', linestyle='--', label='Oversold (30)')
plt.title('RSI Indicator for Maotai Stock', fontsize=14)
plt.xlabel('Date', fontsize=12)
plt.ylabel('RSI', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()



